package modules.listAll;

import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArraySet;


/**
 * 集合类不安全
 *      Set 在并发情况下是不安全的！
 *      会出现java.util.ConcurrentModificationException 并发修改异常！
 *      解决方案：
 *          1、CopyOnWriteArraySet
 *          2、Set<String> set = Collections.synchronizedSet(new HashSet<>());
 * @author shengren.yan
 * @create 2021-03-09
 */
public class Set2 {
    public static void main(String[] args) {

        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i = 1; i <=50 ; i++) {
            new Thread(()->{
                set.add(UUID.randomUUID().toString().substring(0,5));
                System.out.println(set);
            },String.valueOf(i)).start();
        }

    }


    //补充：HashSet底层是什么
    //     hashSet底层就是一个HashMap；

    /**
        public HashSet() {
            map = new HashMap<>();
        }
        add 本质其实就是一个map的key，map的key是无法重复的，所以使用的就是map存储
        //hashSet就是使用了hashmap key不能重复的原理
        public boolean add(E e) {
            return map.put(e, PRESENT)==null;
        }
        //PRESENT是什么？ 是一个常量  不会改变的常量  无用的占位
         private static final Object PRESENT = new Object();
     */
}
